package netty.demo_01_simple;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * Netty快速入门实例-TCP服务
 * 自定义的 客户端 的 Handler，Pipeline 中的处理器
 *
 * @author chenyuan
 * @date 2020/11/6 18:29
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
	/**
	 * 当通道就绪时，就会触发该方法，就可以发信息了
	 *
	 * @param ctx
	 * @throws Exception
	 */
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println("【Client】：ctx" + ctx);
		ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,server", CharsetUtil.UTF_8));
	}

	/**
	 * 当通道有读取事件时 ，会触发
	 *
	 * @param ctx
	 * @param msg
	 * @throws Exception
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		ByteBuf buf = (ByteBuf) msg;
		System.out.println("服务器发送的 msg ：" + buf.toString(CharsetUtil.UTF_8));
		System.out.println("服务器的地址 ：" + ctx.channel().remoteAddress());
	}

	/**
	 * 异常处理
	 *
	 * @param ctx
	 * @param cause
	 * @throws Exception
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		cause.printStackTrace();
		ctx.channel().close();
	}
}
